# -*-coding:utf-8-*-
import re
from LAC import LAC
from ddparser import DDParser
import pkuseg
import os
from pyltp import Postagger
LTP_DATA_DIR='C:\myLTP\ltp_data'
pos_model_path = os.path.join(LTP_DATA_DIR, 'pos.model')
postagger = Postagger() # 初始化实例
postagger.load(pos_model_path)  # 加载模型

'''
2022.6.17
换用北大分词工具 pkuseg
分析存现句的句法结构：
    主[处所词]||动+“着/了”+宾[存在的事物]
    主[处所词]||动+“了/趋向补语/结果补语”+宾[出现、消失的事物]
    主[处所词]||“是、有”+名
    句型：处所词/时间词（前段）+动词（中段）+名词（后断）
    前段：名词、名词+方位词、方位词、介宾短语、动宾短语    f,n+f,s,n+s,TIME,p+n,p+s,v+n,v+s
    中段：有、是、v+有、v+是、v+着/了                  有、是、v+有、v+是、v+着/了
    后段：名词、数量词+名词                            n,q+n

'''

ddp = DDParser()
pkuseg = pkuseg.pkuseg()
lac = LAC()


def judge_zhe(sentence):
    # 判断句子是否符合“前段+中段+后段”的结构
    pattern_1 = re.compile(r'[\u7740]')  # 着
    # pattern_2 = re.compile(r'[\u4e86]')  # 了
    # pattern_3 = re.compile(r'[\u6709]')  # 有
    # pattern_4 = re.compile(r'[\u662f]')  # 是
    if re.findall(pattern_1, sentence) :
        print("含有着字")
    # elif re.findall(pattern_2, sentence):
    #     print("含有了字")
    # elif re.findall(pattern_3, sentence):
    #     print("含有有字")
    # elif re.findall(pattern_4, sentence):
    #     print("含有是字")
    else:
        print("不含任何关键词")


def jude(text):
    sentences = re.split(r"[。；：，！？]", text)

    for sent in sentences:
        print("*" * 100)
        print("sent", sent)
        pkures = pkuseg.cut(sent)
        ddpres = ddp.parse_seg([pkures])
        lacres = lac.run(sent)        # 根据pkuseg分词结果词性标注
        Ltptags = postagger.postag(pkures)  # 词性标注


        print("pk", pkures)
        print("ddp", ddpres)
        print('\t'.join(Ltptags))
        print("lac", lacres)

def jude_f(text):
    sentences = re.split(r"[。；：，！？]", text)


    for sent in sentences:
        fpos = -1
        # pkures = pkuseg.cut(sent)
        # ddpres = ddp.parse_seg([pkures])
        # lacres = lac.run(pkures)
        a, lacres, ddpres = cut_sent(sent)


        # Ltptags = postagger.postag(pkures)  # 词性标注
        # print('\t'.join(Ltptags))
        # print("pk", pkures)
        # print("ddp", ddpres)
        print("lac pos", lacres)
        print("lac", a)
        fpos = judge_double_f(lacres, fpos)

        print("judge_double_f之后", fpos)

        for i in range(len(lacres)):
            if lacres[i] == 'f' or lacres[i] == 's' or lacres[i] == 'TIME' and fpos == -1:
                # judge_double_f(lacres)
                fpos = i

        print("单触发词之后", fpos)
        if fpos > 0:
            print("含有处所词类型，可能是存现句")
        else:
            print("不含处所词类型，不是存现句")

def cut_sent(sent):
    #分词 返回fenci_pos_res,ddpres
    pkures = pkuseg.cut(sent)
    lacres = lac.run(pkures)
    fenci_res = []
    pos_res = []
    for i in range(len(lacres)):
        for j in range(len(lacres[i][0])):
            fenci_res.append(lacres[i][0][j])
            pos_res.append(lacres[i][1][j])
    ddpres = ddp.parse_seg([fenci_res])
    return fenci_res, pos_res, ddpres

def judge_double_f(lacsen1, fpos):
    # type_lst：n+f,n+s,p+宾语,v+宾语
    noun_lst = ['n', 'f', 's', 't', 'nr', 'ns', 'nt', 'nw', 'nz', 'r']

    for i in range(len(lacsen1)):
        if  i < len(lacsen1) - 1:
            if (lacsen1[i] == 'n' and (lacsen1[i + 1] == 'f' or lacsen1[i + 1] == 's')) or (lacsen1[i] == 'p' or lacsen1[i] == 'v') and (lacsen1[i + 1] == 'n' or re.findall(lacsen1[i + 1], ','.join(noun_lst))):
                fpos = i + 1
                break  # 找到最前面的一组疑似处所词类型，后面的就不看了

    return fpos

if __name__ == '__main__':

    text = "由基道边走上两个人。进到院内是一排一排的房子。明信片背后盖着鸟巢的风景邮票。山上有座庙。山上净是石头。明信片背后盖着鸟巢的风景邮票。" \
           "山顶覆盖着白雪。台上坐着主席团。刚才天空中飞着一只老鹰。屋顶上飘着五星红旗。烟囱里冒出一阵阵浓浓的黑烟。他的脸上透出一丝笑意。" \
           "小溪边顿时没有了女人的踪迹。昨天村里死了两头牛。影壁前放着一口大鱼缸。两边摆着两盆石榴树。末班车上挤满了人。大树底下蹲着一个老头儿。" \
           "老王家生了一个胖小子。客厅里走出来一位穿西服的老先生。胡同里搬走了两户人家。昨天到了学校"
    # text = '河里漂着两只船。前面来了两个客人。听说去年来了个小伙子。中间圆桌旁边，孤零零地立着一个圆凳。上周到了一批货，现在就放在港口。江边搬走了好几个工厂。路西边是一片草地。去年发生了几件大事。这里有一本新书。屋子右面放一张木床，铺着单薄的旧床单,堆叠着棉被。依门倒贴一个红“福”字，说是“福倒(到)了”的意思。近床有一张破旧的梳妆台，上面放一只破脸盆。床下横七竖八有几双花鞋,床前搁把椅子。'

    jude_f(text)